﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace ApiData.Common
{
    /// <summary>
    /// Http/Cookie 模拟请求和Cookie操作
    /// </summary>
    public static class HttpHelper
    {
        /// <summary>
        /// 模拟Post提交数据
        /// </summary>
        /// <param name="Url">请求地址</param>
        /// <param name="formData">发送的数据</param>
        /// <returns></returns>
        public static string HttpPost(string Url, Dictionary<string, string> formData)
        {
            // 把数据转为JSON类型
            string dataString = Newtonsoft.Json.JsonConvert.SerializeObject(formData);
            // 通过URL创建一个新的WEB请求
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(Url);
            // 设置请求方式为POST
            httpWebRequest.Method = "POST";
            // 设置请求的内容类型
            httpWebRequest.ContentType = "application/x-www-form-urlencoded";
            // 转换提交数据为byte[]类型
            var data = Encoding.UTF8.GetBytes(dataString);
            // 设置内容长度
            httpWebRequest.ContentLength = data.Length;
            // 获取用于写入请求数据的流对象
            Stream requestStream = httpWebRequest.GetRequestStream();
            // 向文件流对象中写入请求数据
            requestStream.Write(data, 0, data.Length);
            // 获取请求响应（发起请求后服务器的响应）
            HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            // 获取响应流对象
            Stream responseStream = httpWebResponse.GetResponseStream();
            // 初始化流读取对象（设置将要读取的流和内容编码）
            StreamReader streamReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
            // 从流开始读取到结束
            string result = streamReader.ReadToEnd();
            // 关闭读取流
            streamReader.Close();
            // 关闭响应流
            responseStream.Close();
            // 返回读取到的内容（服务器响应内容）
            return result;
        }

        /// <summary>
        /// 模拟Post提交数据
        /// </summary>
        /// <param name="Url">请求地址</param>
        /// <param name="formData">发送的数据</param>
        /// <returns></returns>
        public static string HttpPost(string Url, string formData = "")
        {
            // 通过URL创建一个新的WEB请求
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(Url);
            // 设置请求方式为POST
            httpWebRequest.Method = "POST";
            // 设置请求的内容类型
            httpWebRequest.ContentType = "application/x-www-form-urlencoded";
            // 转换提交数据为byte[]类型
            var data = Encoding.UTF8.GetBytes(formData);
            // 设置内容长度
            httpWebRequest.ContentLength = data.Length;
            // 获取用于写入请求数据的流对象
            Stream requestStream = httpWebRequest.GetRequestStream();
            // 向文件流对象中写入请求数据
            requestStream.Write(data, 0, data.Length);
            // 获取请求响应（发起请求后服务器的响应）
            HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            // 获取响应流对象
            Stream responseStream = httpWebResponse.GetResponseStream();
            // 初始化流读取对象（设置将要读取的流和内容编码）
            StreamReader streamReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
            // 从流开始读取到结束
            string result = streamReader.ReadToEnd();
            // 关闭读取流
            streamReader.Close();
            // 关闭响应流
            responseStream.Close();
            // 返回读取到的内容（服务器响应内容）
            return result;
        }

        /// <summary>
        /// 模拟Get请求
        /// </summary>
        /// <param name="Url">请求地址</param>
        /// <param name="postDataStr">发送的数据（格式为?key=value&key=value）</param>
        /// <returns></returns>
        public static string HttpGet(string Url, string postDataStr = "")
        {
            // 通过URL创建一个新的WEB请求
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(Url + ((postDataStr == "") ? "" : "?") + postDataStr);
            // 设置请求方式为GET
            httpWebRequest.Method = "GET";
            // 设置请求的内容类型
            httpWebRequest.ContentType = "text/html;charset=UTF-8";
            // 获取请求响应（发起请求后服务器的响应）
            HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            // 获取响应流对象
            Stream responseStream = httpWebResponse.GetResponseStream();
            // 初始化流读取对象（设置将要读取的流和内容编码）
            StreamReader streamReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
            // 从流开始读取到结束
            string result = streamReader.ReadToEnd();
            // 关闭读取流
            streamReader.Close();
            // 关闭响应流
            responseStream.Close();
            // 返回读取到的内容（服务器响应内容）
            return result;
        }

        /// <summary>
        /// 去除一段字符串中的HTML标签
        /// </summary>
        /// <param name="html">源HTML的字符串</param>
        /// <param name="length">截取摘要长度[0为不截取]</param>
        /// <param name="placeholder">占位符</param>
        /// <returns></returns>
        public static string ReplaceHtmlTag(string html, int length = 0, string placeholder = "...")
        {
            // 匹配左右尖括号
            string strText = System.Text.RegularExpressions.Regex.Replace(html, "<[^>]+>", "");
            // 匹配html编码符号
            strText = System.Text.RegularExpressions.Regex.Replace(strText, "&[^;]+;", "");
            // 替换所有空格
            strText = strText.Replace(" ", "");
            // 替换所有换行
            strText = strText.Replace("\r\n", "");
            // 判断字符串长度
            if (length > 0 && strText.Length > length)
            {
                // 截取字符串并添加占位符
                return strText.Substring(0, length) + placeholder;
            }
            // 返回字符串
            return strText;
        }
    }
}